import { Toast } from 'antd-mobile'
import axios from 'axios'
import { getTokenInfo, setTokenInfo } from './storage'
import history from './history'
import store from '@/store'
import { logout, saveToken } from '@/store/actions/login'
const baseURL = 'http://geek.itheima.net/v1_0'
const instance = axios.create({
  baseURL: 'http://geek.itheima.net/v1_0',
  timeout: 5000,
})
// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    // 获取token
    const token = getTokenInfo().token
    // console.log('获取token', token)
    // 有token 在请求拦截器统一配置请求token新消息
    if (token) {
      config.headers.Authorization = 'Bearer ' + token
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    return response.data
  },
  async function (error) {
    // 对响应错误做点什么
    // 如果错误存在
    if (!error.response) {
      // 如果没有错误 是接口请求慢的原因  提醒网络繁忙
      Toast.info('网络繁忙,请稍后重试!', 1)
      return Promise.reject(error)
    }
    const { response, config } = error
    // 网络没问题，后台返回了有数据 但是不是401消息
    if (response.status !== 401) {
      // 提醒错误
      Toast.info(error.response.data.message, 1)
      return Promise.reject(error)
    }
    // 网络没问题，且是401 token失效的问题
    // 1. 判断有没有刷新token
    const { refresh_token } = getTokenInfo()
    if (!refresh_token) {
      // 没有refresh_token(有refresh_token但是过期了)
      // 跳转到登录页
      history.push({
        pathname: '/login',
        state: {
          from: history.location.pathname,
        },
      })
      return Promise.reject(error)
    }
    // 是401错误，且有刷新token----->  发请求 返回请求好的数据
    try {
      const res = await axios({
        method: 'put',
        url: `${baseURL}/authorizations`,
        headers: {
          Authorization: 'Bearer ' + refresh_token,
        },
      })
      // 设置token的内容  原来的refresh_token保留  覆盖原来的token
      const tokenInfo = {
        token: res.data.data.token,
        refresh_token,
      }
      // 本地存一份
      setTokenInfo(tokenInfo)
      // redux中存一份
      store.dispatch(saveToken(tokenInfo))
      // token刷新成功  且把重新请求好的数据 返回给用户
      return instance(config)
    } catch (err) {
      // 重新刷新失败
      // 移除token(本地和redux中)
      store.dispatch(logout())
      // 跳转登录页
      history.push({
        pathname: '/login',
        state: {
          from: history.location.pathname,
        },
      })
      return Promise.reject(error)
    }
  }
)

export default instance
